Python 微博好友关系爬虫的知识点梳理总结(WFACat 项目架构)

作者 Marlous 日期 2019-04-13
Python 微博好友关系爬虫的知识点梳理总结(WFACat 项目架构)

本项目仓库:GitHub:WFACat
此文章为 WFACat v2.0

一 软件概况

  1. 软件功能概述:
  • 可以分析任意微博用户的二度人脉(全部为互关好友)情况,人脉深度为 2(生成数据可视化软件 Gephi 所需要的节点文件和边文件 node.csv、edge.csv)。

  • 模块化设计,可以直接使用 main.py;也可以单独使用 get_data.py 来获取到 n 度好友的详细信息;或单独使用 analysis_store_data.py 来对已有(之前 get_data.py 模块下载好的)文件生成 node.csv、edge.csv。

  • 软件使用前需要设置:
    可以通过一个小号,分析数据包获得微博授权的 api 链接(详见我的博文 《通过微博手机客户端爬取数据的分析》),通过此链接可以获得某用户互关好友列表的 json 文件。

  • 生成 temp 文件夹存放每个用户的互关好友列表文件(以该用户 uid 命名);生成 data 文件夹存放要生成的 node.csv、dege.csv 文件。

  • temp 文件夹中以数字命名的文件夹是存几度人脉的好友信息文件。其中每个文件以该用户 uid 命名。

  1. 软件功能功能小结:
  • 需要准备:一个用来获得授权的链接(通过微博账号)、所要研究的用户其用户名。

  • 通过此软件能得到:
    a)tools 模块:某用户信息查询、某用户互关好友列表查询。
    b)用于 Gephi 数据可视化软件分析的 node.csv、edge.csv 文件。
    c)深度分析的信息(更新中):
    查询
    某任意用户信息实时查询;/ 某一互关好友信息实时查询;/ 某一用户信息本地查询(数据库直接能查到的);/ 某个(或全部)一度好友可能通过哪些人认识另外的一度好友;/ 某个(或全部)圈内二度人脉能连接哪些好友,连接几个、哪个是连接最多的(视图)。
    统计(mysql query 模块)
    所有一度人脉信息;/ 所有除节点度为 1 的二度人脉信息;/ 能关联最多一度好友的二度好友,排序;/ 总人数、一度好友数、圈内二度好友数、二度好友数;/ 数据库中若干属性统计(分为总体、一度、二度圈内好友、二度好友)。
    推测
    根据统计的结果做出一些有趣的推测(该用户真实生活城市、在哪个城市生活过(通过一度人脉位置统计)等)。

二 软件使用方法

  1. 使用方法:
  • 运行 main.py,使用 help 命令查看可以使用的命令。

  • conf 命令进行配置(配置授权链接(必填)、要研究对象的微博名称(只使用 tools 模块可以不填)),此配置供生成 csv 文件和数据写入 MySQL 使用。

  • 想生成 csv 文件和数据写入 MySQL,必须先使用 get 命令获得基本的原始数据。

  • 然后分别用 tocsv、tomysql 命令生成 csv 文件供 Gephi 使用,写入数据库供 mysql_query 模块使用(用 detail 命令)。

  • 如果想获得详细的分析结果,使用 detail 命令(首先必须 get、tomysql 将数据写入数据库)。

  • tool 命令可以查某一个微博用户的详细信息;查某一个微博用户的相互关注的人列表及其互关人的详细信息。(此模块运行只需要配置授权链接即可)

  1. 生成的文件夹:
  • 所有基本数据会在 WFACat_data 文件夹中。

  • data 文件夹存放生成的 node.csv、edge.csv 文件,供数据可视化软件 Gephi 分析。

  • temp 文件夹存放互关好友数据。person.json 是研究对象的个人信息,用来提取其 uid 然后生成 1 度人脉文件夹,获取他自己的一度人脉信息(2 度人脉以他的一度人脉信息为种子,遍历下载一度人脉每个好友的好友信息)。数字文件夹表示第几度人脉,其中以 uid 命名的文件夹表示用户,其中的 json 文件是该用户的互关好友信息。

  1. 生成的 MySQL 数据库数据:
  • 表 peopleinfo 里存放整个二度人脉每个人的详细信息(除研究对象)。其中 rel_me 属性 1 表示一度好友、2 表示圈内二度好友、2.1 表示节点度为一的二度好友;/ connect_to_my_friends 属性是研究对象与一度好友间共同关注的一度好友;/ connect_to_two_level_friends 属性表示圈内二度好友列表;/ total_number 属性表示一共的互关好友数。

  • 表 mutualinfo 里存放每个一度好友的互关好友信息。

  • 表 u 开头的是每个一度好友可以间接认识的人,通过谁(除节点度为 1 的二度好友),一共几个人。

生成的 MySQL 数据库数据
生成的 MySQL 数据库数据

三 软件运行逻辑概述

软件运行逻辑细节)

1 准备(settings.py)

  • main.py 中初始化生成一个配置文件 config.json。

  • 进行配置(授权用的私有链接、需要研究的用户微博名)、读取配置。

  • 将授权的私有链接拆解,组装成可以下载某用户信息文件的链接、组装成可以获取某用户互关好友列表文件的链接。

2 下载数据文件(get_data.py)

  • 下载所要分析用户的用户信息文件,获取其 uid,然后下载其互关好友列表文件(一度人脉),文件名以他的 uid 命名。

  • 通过此,所要研究的用户的互关好友列表文件作为启动种子文件,以此为起点。存放在 \WFACat_data\temp\1\XX(uid)XX 文件夹中。

  • 以人脉深度为循环次数,从文件夹 1 开始 -> 遍历用户文件夹 -> 遍历用户文件夹中的 json 文件 -> 遍历 json 中每个 uid,根据此 uid 下载好友信息的 json 文件。存在下一度人脉文件夹中对应 uid 用户文件夹中(注意,下载该用户全部好友信息的 json 文件写成函数,page 参数累加构造请求来下载)。

3 生成 csv 或写入 MySQL

  • 获取到所有基本信息文件后。以人脉深度为循环次数,从文件夹 1 开始 -> 遍历用户文件夹 -> 遍历用户文件夹中的 json 文件 -> 遍历 json 中每个 uid 等信息。

  • 生成 csv 文件或写入 MySQL(具体方法见上面分析)。核心在于怎样遍历,读取到用户信息,然后根据此信息分析写入数据。

四 软件运行逻辑详解(思维导图)

软件运行逻辑(思维导图)

1 解释

  • 整个二度人脉所有人(节点)集合可分为四类:
    研究对象(如自己)、一度好友、圈内二度好友(连接各个一度好友)、圈外二度好友(节点的度为 1,大概率与自己朋友圈无关,本项目不研究)。

  • 自己的互关好友列表(用一个字典 A 表示:自己的 uid 为键,互关列表为值)。my_friendinfo_dict

  • 若干个一度好友的互关列表(同样用一个字典 B 表示:该一度好友的 uid 为键,互关列表为值)。friends_friendinfo_dict

  • 圈内二度好友(除节点度为 1 的二度好友)集合 C:
    通过字典 B 中每个值(一度好友互关列表)两两取交集,然后除去自己和所有一度好友。two_level_useful_friends_list

  • 计算每个一度好友与自己共同关注的一度好友:
    字典 B 中某值与字典 A 中值取交集,直接写入数据库。

  • 计算每个一度好友的圈内二度好友(用字典 D 表示:键为该一度好友 uid,值为圈内二度好友列表):
    字典 B 中某值与 C 取交集。friends_two_level_friendinfo_dict

  • 计算每个一度好友能间接认识哪些一度好友:
    字典 D 的值(圈内二度好友列表)两两取交集,有交集表示可以间接认识,交集部分是通过谁认识的。
    有交集则创建彼此 uid 的表,分别将对方 uid 写入自己的表,并写入交集部分,交集列表长度即通过多少人认识。

2 补充

两两取交集的意思:
两两取交集的意思)

通过两层循环(外循环遍历从第一个元素到倒数第二个元素;内循环拿外循环这个元素分别与自己的下一个元素比较,到最后一个元素),有若干个元素两两比较,不重复比较。总比较次数为排列组合中 C n 2 次。如图假设自己共 30 个互关的一度人脉好友。

两两取交集的意思)

3 对数据库深度分析(mysql_query.py)

  1. 查询:
  • 通过微博用户名查某用户基本信息

  • 通过 uid 查某用户基本信息

  • 通过微博用户名查某用户的互关好友列表及其好友信息

  • 通过微博用户名查某一度好友能通过圈内二度好友认识的一度好友

  • 所有一度好友信息

  1. 统计:
  • 总体概况:总人数、一度好友数、圈内二度好友数、二度好友数

  • 能关联最多一度好友的圈内二度好友(取 10 条排序),能关联谁

  • 一度好友中与其他一度好友互关最多的人(排序)、与圈内二度好友互关最多的人;分别是哪些人

  • 一度好友 / 圈内二度好友 / 二度好友中认证情况统计

  • 一度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端

  • 圈内二度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端

  • 二度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端

  1. 推测:
    根据统计的结果做出一些有趣的推测(如统计手机客户端型号等)。

五 遇到的问题

  • 拆分授权链接、拆分授权链接中请求参数
  • 组装请求链接
  • 判断、创建文件夹
  • 读写 json、csv 文件
  • 下载文件,判断是否有下载异常
  • 通过循环、多层遍历访问文件夹、文件
  • Python 中使用 MySQL
  • 所要获得的数据计算思路
  • 判断某数据库是否存在
  • 根据想要获得存储的信息设计数据库、表(数据库要用 utf8mb4,否则无法存储 4 字节的 Emoji 表情)
  • 读取 json 文件想要的信息时的对数据的处理:判断某个键是否存在。/ 用正则表达式转义特殊字符。/ 用正则表达式过滤想要的字符串。
  • 通过写入数据库的基本信息,设计 mysql_query.py 模块做深度分析(基本数据查询、统计、推测判断)。

六 使用部分截图

所有操作都通过 main.py 完成。

1 main.py、help.py

main.py

2 settings.py

settings.py

3 get_data.py

get_data.py

4 analysis_to_csv.py

analysis_to_csv.py

5 analysis_to_mysql

analysis_to_mysql

6 tools.py

tools.py

7 mysql_query.py

tools.py